package br.com.lucasddaniel.inbuzios.dao;

import java.util.ArrayList;
import java.util.Hashtable;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDiskIOException;
import br.com.lucasddaniel.inbuzios.bean.PasseioBean;
import br.com.lucasddaniel.inbuzios.bean.TuristaBean;

/**
 * Classe de manipula�ao dos dados para enviar � persistencia.
 * 
 * @author ldsm
 * 
 */
public class TuristaRepositorio {

	/**
	 * Insere um turista na base.
	 * 
	 * @param turista
	 * @throws ExcessaoBanco
	 */
	public int inserir(TuristaBean turista, Context ctx) throws ExcessaoBanco {
		int id = 0;
		try {
			TuristaAdaptadorBanco.abre(ctx);
			ContentValues cv = new ContentValues();
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), turista.getNumRegistro());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[2].getColumnName(), turista.getVooIn());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[3].getColumnName(), turista.getPousada());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), turista.getNome());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[5].getColumnName(), turista.getQuantidade());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[6].getColumnName(), turista.getVooOut());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[7].getColumnName(), turista.getObservacao());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[8].getColumnName(), turista.getMotorista());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), turista.getOperador());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[10].getColumnName(), turista.getDataSaida());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[11].getColumnName(), turista.getHoraChegada());

			id = TuristaAdaptadorBanco.insere(TuristaEsquemaBanco.TABLE_NAME, cv);
		} catch (SQLiteDiskIOException diskIOException) {
			throw new ExcessaoBanco("Memoria insuficiente para criar ou copiar itens.", ExcessaoBanco.INSUFFICIENT_MEMORY);
		} finally {
			TuristaAdaptadorBanco.fecha(true);
		}
		return id;
	}

	/**
	 * Atualiza um turista na base.
	 * 
	 * @param turista
	 * @throws ExcessaoBanco
	 */
	public void atualizar(TuristaBean turista, Context ctx) throws ExcessaoBanco {
		try {
			TuristaAdaptadorBanco.abre(ctx);
			ContentValues cv = new ContentValues();
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), turista.getNumRegistro());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[2].getColumnName(), turista.getVooIn());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[3].getColumnName(), turista.getPousada());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), turista.getNome());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[5].getColumnName(), turista.getQuantidade());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[6].getColumnName(), turista.getVooOut());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[7].getColumnName(), turista.getObservacao());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[8].getColumnName(), turista.getMotorista());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[9].getColumnName(), turista.getOperador());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[10].getColumnName(), turista.getDataSaida());
			cv.put(TuristaEsquemaBanco.TABLE_COLUMNS[11].getColumnName(), turista.getHoraChegada());

			TuristaAdaptadorBanco.atualiza(TuristaEsquemaBanco.TABLE_NAME, cv, "" + turista.getId());
		} catch (SQLiteDiskIOException diskIOException) {
			throw new ExcessaoBanco("Memoria insuficiente para criar ou copiar itens.", ExcessaoBanco.INSUFFICIENT_MEMORY);
		} finally {
			TuristaAdaptadorBanco.fecha(true);
		}
	}

	/**
	 * Pesquisa um turista de acordo com o nome ou o registro.
	 * 
	 * @param turista
	 * @return
	 * @throws ExcessaoBanco
	 */
	public TuristaBean buscar(TuristaBean turista, Context ctx) throws ExcessaoBanco {
		Hashtable<String, String> filters = new Hashtable<String, String>();
		if (turista.getId() != null) {
			filters.put(TuristaEsquemaBanco.TABLE_COLUMNS[0].getColumnName(), "" + turista.getId());
		}
		if (turista.getNumRegistro() != null) {
			filters.put(TuristaEsquemaBanco.TABLE_COLUMNS[1].getColumnName(), "" + turista.getNumRegistro());
		}
		if (turista.getNome() != null) {
			filters.put(TuristaEsquemaBanco.TABLE_COLUMNS[4].getColumnName(), "" + turista.getNome());
		}
		TuristaBean retorno = null;
		try {
			TuristaAdaptadorBanco.abre(ctx);
			Cursor cursorResult = TuristaAdaptadorBanco.getObjects(TuristaEsquemaBanco.TABLE_NAME, filters);
			if (cursorResult.moveToFirst()) {
				retorno = new TuristaBean();
				retorno.setId(cursorResult.getInt(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[0].getColumnName())));
				retorno.setNumRegistro(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[1].getColumnName())));
				retorno.setVooIn(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[2].getColumnName())));
				retorno.setPousada(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[3].getColumnName())));
				retorno.setNome(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[4].getColumnName())));
				retorno.setQuantidade(cursorResult.getInt(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[5].getColumnName())));
				retorno.setVooOut(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[6].getColumnName())));
				retorno.setObservacao(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[7].getColumnName())));
				retorno.setMotorista(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[8].getColumnName())));
				retorno.setOperador(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[9].getColumnName())));
				retorno.setDataSaida(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[10].getColumnName())));
				retorno.setHoraChegada(cursorResult.getLong(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[11].getColumnName())));
			}
			cursorResult.close();
		} catch (SQLiteDiskIOException diskIOException) {
			throw new ExcessaoBanco("Memoria insuficiente para criar ou copiar itens.", ExcessaoBanco.INSUFFICIENT_MEMORY);
		} finally {
			TuristaAdaptadorBanco.fecha(true);
		}
		return retorno;
	}

	/**
	 * Lista todos os turistas.
	 * 
	 * @return
	 * @throws ExcessaoBanco
	 */
	public ArrayList<TuristaBean> listar(Context ctx) throws ExcessaoBanco {
		ArrayList<TuristaBean> result = new ArrayList<TuristaBean>();
		try {
			TuristaAdaptadorBanco.abre(ctx);
			Hashtable<String, String> filters = new Hashtable<String, String>();
			Cursor cursorResult = TuristaAdaptadorBanco.getObjects(TuristaEsquemaBanco.TABLE_NAME, filters);
			if (cursorResult.moveToFirst()) {
				do {
					TuristaBean turista = new TuristaBean();
					turista.setId(cursorResult.getInt(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[0].getColumnName())));
					turista.setNumRegistro(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[1].getColumnName())));
					turista.setVooIn(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[2].getColumnName())));
					turista.setPousada(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[3].getColumnName())));
					turista.setNome(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[4].getColumnName())));
					turista.setQuantidade(cursorResult.getInt(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[5].getColumnName())));
					turista.setVooOut(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[6].getColumnName())));
					turista.setObservacao(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[7].getColumnName())));
					turista.setMotorista(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[8].getColumnName())));
					turista.setOperador(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[9].getColumnName())));
					turista.setDataSaida(cursorResult.getString(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[10].getColumnName())));
					turista.setHoraChegada(cursorResult.getLong(cursorResult.getColumnIndex(TuristaEsquemaBanco.TABLE_COLUMNS[11].getColumnName())));

					result.add(turista);
				} while (cursorResult.moveToNext());
			}
			cursorResult.close();
		} catch (SQLiteDiskIOException diskIOException) {
			throw new ExcessaoBanco("Memoria insuficiente para criar ou copiar itens.", ExcessaoBanco.INSUFFICIENT_MEMORY);
		} finally {
			TuristaAdaptadorBanco.fecha(true);
		}
		return result;
	}

	/**
	 * Apaga tabela ao exportar dados por regra de neg�cio.
	 * 
	 * @throws ExcessaoBanco
	 */
	public void apagarDadosTuristasCadastrados(Context ctx) throws ExcessaoBanco {
		try {
			TuristaAdaptadorBanco.abre(ctx);
			TuristaAdaptadorBanco.apagarDadosTuristasCadastrados();
		} catch (SQLiteDiskIOException diskIOException) {
			throw new ExcessaoBanco("Memoria insuficiente para criar ou copiar itens.", ExcessaoBanco.INSUFFICIENT_MEMORY);
		} finally {
			TuristaAdaptadorBanco.fecha(true);
		}
	}
}
